home *** CD-ROM | disk | FTP | other *** search
- static char wreadtime_prg1[] =
- "@(#)char *wreadtimew(WINDOW *win,int f, char *tstr) - Zeit einlesen (Curses-win)";
- static char wreadtime_prg2[] =
- "@(#)char *readtimew(int f, char *tstr) - Zeit einlesen (Curses-stdscr)";
- static char readtime_ver[] = "@(#)v1.00/kr ; 01.08.91";
- /* wreadtimew Einlesen eines Zeit-String unter Curses
- **
- ** Autor Klaus Rath
- **
- ** Deklaration char *wreadtimew(WINDOW *win,int format,char *timestring);
- ** char *readtimew(int format, char *timestring);
- **
- ** Compilation DOS: bcc -c readtime.c c:\usr\local\lib\libkrc_s.lib
- ** UNIX: cc -c readtime.c /u1/usr/lib/libkrc.a
- ** ( unter DOS kann die Funktion im small-Modell laufen )
- **
- ** Übergabe Die Funktion erwartet einen Integer, der angibt in wel-
- ** chem Format eingelesen werden soll.
- ** Z.Zt. erlaubte Formate (siehe datum.h) :
- ** hh:mm[:ss] -- Formate 1,2
- ** hh.mm[.ss] -- Formate 3,4
- ** hhmm[ss] -- Datenbankformate 5,6 (DDB/4)
- ** Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
- ** des Ergebnisses erwartet.
- **
- ** Rückgabe (char *) auf timestring
- **
- ** Anmerkungen Die Funktion prüft nicht die Validität der eingegebenen
- ** Zeit - dies sollte die aufrufende Funktion selbst tun,
- ** bzw. den Test durch checktime() durchführen lassen.
- ** Die Funktion benutzt zum Einlesen wgetch(win).
- ** wreadtime() stellt dem Aufrufer eine Maske des angeforder-
- ** ten Format zur Verfügung ( z.B. __:__:__ ), wobei die
- ** Unterstriche durch Zahlen gefüllt werden müssen. Die
- ** u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
- ** nicht editierbar und werden automatisch erzeugt. Eine
- ** Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
- ** Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
- ** immer, hinter der letzten Position genügt ein beliebiges
- ** Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
- **
- ** Änderungen 1.00 ; 01.08.91
- ** - Erste Version für CURSES, basiert auf Version 1.10 von
- ** readtime()
- ** 1.01 ; 12.12.91
- ** - Einlesefehler beseitigt: obwohl für ein WINDOW *win
- ** konzipiert, wurde in wreadtime() mit getch() gelesen.
- */
-
- #include <curses.h>
- #include <stdio.h>
- #include <string.h>
- #ifdef __TURBOC__
- #define ANSI
- #define KR_SYS
- #include <stdlib.h>
- #include "datum.h"
- #include "util.h"
- #else
- #include "/u1/usr/include/datum.h"
- #include "/u1/usr/include/util.h"
- #endif
-
- #ifdef ANSI
- char *wreadtimew(WINDOW *win,int format, char *tstring)
- #else
- char *wreadtimew(win,format,tstring)
- WINDOW *win;
- int format;
- char *tstring;
- #endif
- {
- /* Variablendefinitionen :
- */
- int trennpos1 = 2, /* Positionen von Trennzeichen */
- trennpos2 = 5;
- int trenner; /* das Trennzeichen */
- int pos = 0; /* Aktuelle Position */
- int maxpos = 11; /* Letztmögliche Position */
- int Max = 0; /* Schalter, ob am Ende */
- int ch; /* Einzulesendes Zeichen */
- int def_char = '0'; /* Default-Character */
-
- /* Evtl. 1. Zeichen berücksichtigen :
- */
- if ( tstring[0] == NULL ) {
- tstring[0] = def_char;
- }
- else {
- pos = 1;
- }
-
- /* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
- */
- switch ( format ) {
- case TI_HM_D :
- trenner = ':';
- maxpos = 6;
- tstring[trennpos1] = trenner;
- tstring[1] =
- tstring[3] =
- tstring[4] = def_char;
- tstring[5] = '\0';
- trennpos2 = 99;
- wprintw(win,"%c0:00",tstring[0]);
- wprintw(win,"\b\b\b\b");
- break;
- case TI_HM_P :
- trenner = '.';
- maxpos = 6;
- tstring[trennpos1] = trenner;
- tstring[1] =
- tstring[3] =
- tstring[4] = def_char;
- tstring[5] = '\0';
- trennpos2 = 99;
- wprintw(win,"%c0.00",tstring[0]);
- wprintw(win,"\b\b\b\b");
- break;
- case TI_HMS_P :
- trenner = '.';
- maxpos = 9;
- tstring[trennpos1] =
- tstring[trennpos2] = trenner;
- tstring[1] =
- tstring[3] =
- tstring[4] =
- tstring[6] =
- tstring[7] = def_char;
- tstring[8] = '\0';
- wprintw(win,"%c0.00.00",tstring[0]);
- wprintw(win,"\b\b\b\b\b\b\b");
- break;
- case TI_HM_DB :
- maxpos = 5;
- tstring[1] =
- tstring[2] =
- tstring[3] = def_char;
- tstring[4] = '\0';
- trennpos1 =
- trennpos2 = 99;
- wprintw(win,"%c000",tstring[0]);
- wprintw(win,"\b\b\b");
- break;
- case TI_HMS_DB :
- maxpos = 7;
- tstring[1] =
- tstring[2] =
- tstring[3] =
- tstring[4] =
- tstring[5] = def_char;
- tstring[6] = '\0';
- trennpos1 =
- trennpos2 = 99;
- wprintw(win,"%c00000",tstring[0]);
- wprintw(win,"\b\b\b\b\b");
- break;
- case TI_HMS_D :
- default :
- trenner = ':';
- maxpos = 9;
- tstring[trennpos1] =
- tstring[trennpos2] = trenner;
- tstring[1] =
- tstring[3] =
- tstring[4] =
- tstring[6] =
- tstring[7] = def_char;
- tstring[8] = '\0';
- wprintw(win,"%c0:00:00",tstring[0]);
- wprintw(win,"\b\b\b\b\b\b\b");
- break;
- } /* ENDE: switch(format) */
-
- /* Evtl. noch ein Rückschritt :
- */
- if ( !pos ) {
- wprintw(win,"\b");
- }
- wrefresh(win);
-
- /* Tastendrucke abholen, bis maxpos :
- */
- while ( pos < maxpos + 1 ) {
-
- if ( pos == 0 ) {
- tstring[pos] = def_char;
- }
- wrefresh(win);
-
- /* Falls fertig, String zurückgeben :
- */
- if ( pos == maxpos ) {
- tstring[pos] = '\0';
- return(tstring);
- }
- /* An eventuellen Trennerpositionen den passenden Trenner einfügen
- ** und den nächsten Schleifendurchlauf abwarten :
- */
- if ( pos == trennpos1 || pos == trennpos2 ) {
- wprintw(win,"%c",trenner);
- wrefresh(win);
- pos++;
- continue;
- }
- /* An der vorletzten Position sind alle Tasten erlaubt, denn nur
- ** BACKSPACE bleibt in der Funktion :
- */
- if ( pos == maxpos - 1 ) {
- Max = 1;
- }
- ch = wgetch(win);
-
- /* Auswertung der gedrückten Taste :
- */
- switch ( ch ) {
-
- /* Nicht Zulässiges ignorieren :
- */
- case NULL:
- case -1 :
- break;
-
- /* Abbruchmöglichkeiten :
- */
- case 27 :
- tstring[0] = '\0';
- return(tstring);
- case 10 :
- case 13 :
- tstring[maxpos-1] = '\0';
- return(tstring);
-
- /* Korrekturmöglichkeit :
- */
- case 8 :
- if ( pos == 0 ) {
- break;
- }
- tstring[pos] = def_char;
-
- /* Schalter für MAX-Position zurücksetzen :
- */
- if ( Max )
- Max = 0;
-
- /* Trenner überspringen und Maskendefault anzeigen :
- */
- if ( pos == trennpos1 + 1 || pos == trennpos2 + 1 ) {
- wprintw(win,"\b\b%c\b",def_char);
- wrefresh(win);
- pos -= 2;
- break;
- }
-
- /* Ansonsten zurück und Maskendefault anzeigen :
- */
- if ( pos ) {
- pos--;
- }
- wprintw(win,"\b%c\b",def_char);
- wrefresh(win);
- break;
-
- default :
- /* Falls wir fertig sind, String abschließen und
- ** zurückgeben :
- */
- if ( Max ) {
- tstring[pos] = '\0';
- return(tstring);
- }
-
- /* Ansonsten ist es eine Zahl, die angezeigt und ein-
- ** getragen wird :
- */
- if ( ch > '9' || ch < '0' ) {
- break;
- }
- wprintw(win,"%c",ch);
- wrefresh(win);
- tstring[pos] = ch;
- pos++;
-
- } /* ENDE: switch(ch) */
- } /* ENDE: while(pos) */
-
- return(tstring);
-
- } /* ENDE: wreadtimew() */
-
- /* Version für stdscr :
- */
- char *readtimew(format,tstring)
- int format;
- char *tstring;
- {
- wreadtimew(stdscr,format,tstring);
- return(tstring);
- } /* ENDE: readtimew() */
-